/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo5;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.joda.time.LocalTime;

/**
 *
 * @author Miguel
 */
public class Trayecto {

     /**
      *
      * @param numTramos numero de tramos del trayecto
      * @param horarios horarios que cumple el trayecto
      * @param ciudadOrigen ciudad origen del trayecto
      * @param ciudadDestino ciudad destino del trayecto
      * @throws IllegalArgumentException
     */
    public Trayecto(int numTramos, List<HorarioTren> horarios, String ciudadOrigen, String ciudadDestino) throws IllegalArgumentException
    {
        Args.comprobarNumeral(numTramos);
        Args.comprobarNulo(horarios);
        Args.comprobarCadena(ciudadOrigen);
        Args.comprobarCadena(ciudadDestino);
        
        this.numTramos = numTramos;
        this.horarios = horarios;
        this.ciudadOrigen = ciudadOrigen;
        this.ciudadDestino = ciudadDestino;
    }

    /**
     * Método que busca si existe una hora especificada dentro de los horarios de la agencia.
     *
     * @param hora hora de salida que se quiere encontrar
     * @return el horario si existe y si no null
     * @throws IllegalArgumentException
     */
    public Horario encontrarHorario(LocalTime hora) throws IllegalArgumentException
    {
        Args.comprobarNulo(hora);
        
        Iterator<HorarioTren> ltr = horarios.iterator();
        Boolean encontrado = false;
        HorarioTren h = null;

        while(ltr.hasNext() && !encontrado)
        {
            h = ltr.next();
            
            LocalTime hh = new LocalTime(h.getHoraSalida());

            if(hh.isEqual(hora))
            {
                encontrado = true;
            }
        }

        if(encontrado)
        {
            return h;
        }
        else
        {
            return null;
        }
    }

    /**
     * Se encarga de obtener los horarios que existen en la agencia para un determinado trayecto
     *
     * @return los horarios que cumple un trayecto
     */
    public Iterator<HorarioTren> getHorarios()
    {
        return horarios.iterator();
    }

    /**
     * Calcula el precio del trayecto de todos sus horarios
     * @return un map con las horas de salida y llegada, el numero de asientos y el precio de cada horario
     */
    public Map<Horario, Double> calcularPrecioTrayecto()
    {
        Map<Horario, Double> horariosPrecios = new HashMap<Horario,Double>();

       for(HorarioTren hora : horarios)
       {
            double precio = hora.getTren().getPrecioTren() * numTramos;
            horariosPrecios.put(hora,precio);
       }

        return horariosPrecios;
    }

    /**
     * Calcula el precio del trayecto de todos sus horarios
     * @return un map con las horas de salida y llegada, el numero de asientos y el precio de cada horario
     */
    public double calcularPrecioTrayecto(LocalTime hora)
    {
       HorarioTren h = (HorarioTren)this.encontrarHorario(hora);

       if(h != null)
       {
           return h.getTren().getPrecioTren() * numTramos;
       }
       else
       {
           throw new RuntimeException("Trayecto: No se encuentra el horario especificado.");
       }
    }

    /**
     *
     * @return la ciudad origen del trayecto
     */
    public String getCiudadOrigen()
    {
        return ciudadOrigen;
    }

    /**
     *
     * @return la ciudad destino del trayecto
     */
    public String getCiudadDestino()
    {
        return ciudadDestino;
    }

    /**
     * 
     * @return el numero de tramos del trayecto
     */
    public int getNumTramos()
    {
        return numTramos;
    }

    private String ciudadOrigen,ciudadDestino;
    private int numTramos;
    private List<HorarioTren> horarios;
}